package login.form.controller;

import java.io.Serializable;
import java.util.ArrayList;
import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Named;
import login.form.model.Usuario;
import login.form.persistencia.Persistencia;

/**
 * Backing Bean: vincula��o com as p�ginas JSF da aplica��o.
 * @author Baracho
 * @version 1.0
 * @since 23/10/2012
 */

@Named("usuarioBean")
@SessionScoped
public class UsuarioBean implements Serializable {
	// Vari�veis de inst�ncia
	private static final long serialVersionUID = 4790044098281089192L;
	private Usuario usuario;
	private String confirmaSenha;
	private Persistencia persistencia;
	private String errorPageMessage;
	// Fun��o construtora da classe
	public UsuarioBean() {
		usuario = new Usuario();
		persistencia = new Persistencia();
	}

	// M�todos de acesso
	/**
	 * @return the usuario
	 */
	public Usuario getUsuario() {
		return usuario;
	}

	/**
	 * @param usuario
	 *            the usuario to set
	 */
	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	/**
	 * @return the confirmaSenha
	 */
	public String getConfirmaSenha() {
		return confirmaSenha;
	}

	/**
	 * @param confirmaSenha
	 *            the confirmaSenha to set
	 */
	public void setConfirmaSenha(String confirmaSenha) {
		this.confirmaSenha = confirmaSenha;
	}

	/**
	 * @return the errorPage
	 */
	public String getErrorPageMessage() {
		return errorPageMessage;
	}

	/**
	 * @param errorPageMessage
	 *            the errorPage to set
	 */
	public void setErrorPageMessage(String errorPageMessage) {
		this.errorPageMessage = errorPageMessage;
	}

	// Opera��es da classe

	public String salvar() {

		FacesContext context = FacesContext.getCurrentInstance();

		if (!this.usuario.getSenha().equals(this.confirmaSenha)) {

			context.addMessage(null, new FacesMessage(
					FacesMessage.SEVERITY_ERROR,
					"Senha confirmada incorretamente", ""));

			return "cadastrarUsuario";
		}

		if (persistencia.validarNomeUsuario(usuario.getNomeUsuario())) {

			context.addMessage(
					null,
					new FacesMessage(
							FacesMessage.SEVERITY_INFO,
							"Usu�rio j� cadastrado! Favor informar novo nome de usu�rio.",
							""));

			return "cadastrarUsuario";
		}

		usuario = persistencia.salvar(usuario);

		if (this.usuario == null) {

			setErrorPageMessage("UsuarioBean - salvar: n�o foi poss�vel salvar os dados do usu�rio.");

			return "pageError";
		}

		return "cadastrarSucesso";
	}

	public ArrayList<Usuario> getConsulta() {

		return persistencia.consultar();
	}

	public String atualizarUsuario(int usuarioID) {

		this.usuario = persistencia.pesquisar(usuarioID);

		if (this.usuario == null) {

			setErrorPageMessage("UsuarioBean - atualizar: n�o foi poss�vel pesquisar o usu�rio.");

			return "errorPage";

		}

		return "atualizarUsuario";

	}

	public String atualizar() {

		FacesContext context = FacesContext.getCurrentInstance();

		if (persistencia.validarNomeUsuario(this.usuario.getNomeUsuario(),
				this.usuario.getUsuarioID())) {

			context.addMessage(
					null,
					new FacesMessage(
							FacesMessage.SEVERITY_ERROR,
							"Usu�rio j� cadastrado! Favor informar novo nome de usu�rio.",
							""));

			return "atualizarUsuario";
		}

		if (!this.usuario.getSenha().equals(this.confirmaSenha)) {

			context.addMessage(
					null,
					new FacesMessage(
							FacesMessage.SEVERITY_ERROR,
							"Senha confirmada incorretamente! Favor informar os dados novamente.",
							""));

			return "atualizarUsuario";

		}

		persistencia.atualizar(usuario);

		this.usuario = persistencia.pesquisar(usuario.getUsuarioID());

		return "atualizarSucesso";
	}

	public String excluirUsuario(int usuarioID) {

		this.usuario = persistencia.pesquisar(usuarioID);

		if (this.usuario == null) {

			setErrorPageMessage("UsuarioBean - excluir: n�o foi poss�vel pesquisar usu�rio.");

			return "errorPage";

		}

		return "excluirUsuario";
	}

	public String excluir() {

		this.usuario = persistencia.pesquisar(this.usuario.getUsuarioID());

		if (!persistencia.excluir(this.usuario)) {

			setErrorPageMessage("UsuarioBean - excluir: n�o foi poss�vel excluir usu�rio.");

			return "errorPage";

		}

		return "excluirSucesso";
	}

	public String novo() {

		limpaCampos();

		return "loginUsuario";
	}

	public String autenticarUsuario() {

		FacesContext context = FacesContext.getCurrentInstance();

		this.usuario = persistencia.autenticarUsuario(this.usuario);

		if (this.usuario == null) {

			context.addMessage(
					null,
					new FacesMessage(
							FacesMessage.SEVERITY_INFO,
							"Nome ou senha informado incorretamente! Favor informar novamente os dados.",
							""));

			return "loginUsuario";
		}

		this.usuario = persistencia.pesquisar(this.usuario.getUsuarioID());

		if (this.usuario == null) {

			setErrorPageMessage("UsuarioBean - autenticar: n�o foi poss�vel recuperar os dados do usu�rio.");

			return "errorPage";
		}

		return "loginSucesso";
	}

	public void limpaCampos() {

		this.usuario.setUsuarioID(0);
		this.usuario.setNomeUsuario("");
		this.usuario.setEmail("");
		this.usuario.setSenha("");
		this.confirmaSenha = "";
	}
}